Oracle RAC 11G 11.2.0.4 OEL7.9 最佳实践
1 背景知识
本章介绍如何在 Oracle Linux 7.9 上安装 Oracle 11G RAC集群。
2 操作系统准备
以下操作都需要在 rac1 节点和 rac2 节点执行。
2.1 DNS 解析设置
#rac1#root>
#rac2#root>
cat >> /etc/hosts << EOF
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost
#public ip
192.168.10.216 rac1
192.168.10.217 rac2
#vip
192.168.10.214 rac1-vip
192.168.10.215 rac2-vip
#private ip
192.168.122.31 rac1-priv
192.168.122.32 rac2-priv
#scanip
192.168.10.213 scan-ip
EOF
2.2 执行操作系统优化
#rac1#root>
#rac2#root>
bash optimize_system_conf_oracle.sh
2.3 创建目录
#rac1#root>
#rac2#root>
mkdir -p /u01/app/grid/product/11.2.0/db_1
mkdir -p /u01/app/oracle/product/11.2.0/db_1
mkdir -p /u01/app/grid/
chown -R oracle:dba /u01/app/oracle
chown -R grid:dba /u01/app/grid
chown grid:dba /u01/app/
chmod -R 775 /u01/app/oracle
chmod -R 775 /u01/app/grid
2.4 安装依赖包
Oracle Linux 操作系统。
#rac1#root>
#rac2#root>
yum install -y oracle-rdbms-server-11gR2-preinstall.x86_64
yum install unzip gcc elfutils-libelf-devel gcc-c++ chrony -y
安装oracleasm工具包。
#rac1#root>
#rac2#root>
yum install oracleasm* -y
2.5 设置Oracle环境变量
请参考 11G 环境变量。
2.5.1 rac1
#rac1#root>
su - oracle
cat >> ~/.bash_profile << EOF
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=\$ORACLE_BASE/product/11.2.0/db_1
export ORACLE_SID=citdb1
export ORACLE_UNQNAME=citdb1
export PATH=\$ORACLE_HOME/bin:\$PATH
export LANG=C
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:
export DISPLAY=192.168.10.133:0.0
export CVUQDISK_GRP=dba
EOF
2.5.2 rac2
#rac2#root>
su - oracle
cat >> ~/.bash_profile << EOF
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=\$ORACLE_BASE/product/11.2.0/db_1
export ORACLE_SID=citdb2
export ORACLE_UNQNAME=citdb2
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:
export DISPLAY=192.168.10.130:0.0
export CVUQDISK_GRP=dba
export LANG=C
EOF
2.6 设置GRID 环境变量
2.6.1 rac1
#rac1#root>
su - grid
cat >> ~/.bash_profile << EOF
export ORACLE_BASE=/u01/app/grid/base
export ORACLE_HOME=/u01/app/grid/product/11.2.0/db_1
export ORACLE_SID=+ASM1
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:
export DISPLAY=192.168.10.130:0.0
export CVUQDISK_GRP=dba
export LANG=C
EOF
2.6.2 rac2
#rac2#root>
su - grid
cat >> ~/.bash_profile << EOF
export ORACLE_BASE=/u01/app/grid/base
export ORACLE_HOME=/u01/app/grid/product/11.2.0/db_1
export ORACLE_SID=+ASM2
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:
export DISPLAY=192.168.10.130:0.0
export CVUQDISK_GRP=dba
export LANG=C
EOF
2.7 ROOT 的环境变量
#rac1#root>
#rac2#root>
cat >> ~/.bash_profile << EOF
export PATH=/u01/app/grid/product/11.2.0/db_1/bin:\$PATH
export LANG=C
EOF
2.8 调整/dev/shm
- 增大 tmpfs 文件系统大小。
#rac1#root>
#rac2#root>
cat >> /etc/fstab << EOF
tmpfs /dev/shm tmpfs defaults,size=8192M 0 0
EOF
- 重新挂载 tmpfs 文件系统。
#rac1#root>
#rac2#root>
mount -o remount /dev/shm
3 创建UDEV 共享磁盘设备
3.1 使用by-path 确定磁盘的路径
#root>
ls /dev/disk/by-path/* -l
lrwxrwxrwx 1 root root 9 Feb 3 12:44 /dev/disk/by-path/pci-0000:02:01.0-ata-1.0 -> ../../sr0
lrwxrwxrwx 1 root root 9 Feb 3 12:44 /dev/disk/by-path/pci-0000:03:00.0-scsi-0:0:0:0 -> ../../sda
lrwxrwxrwx 1 root root 10 Feb 3 12:44 /dev/disk/by-path/pci-0000:03:00.0-scsi-0:0:0:0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Feb 3 12:44 /dev/disk/by-path/pci-0000:03:00.0-scsi-0:0:0:0-part2 -> ../../sda2
lrwxrwxrwx 1 root root 9 Feb 3 12:49 /dev/disk/by-path/pci-0000:0b:00.0-scsi-0:0:0:0 -> ../../sdb
lrwxrwxrwx 1 root root 9 Feb 3 12:49 /dev/disk/by-path/pci-0000:0b:00.0-scsi-0:0:1:0 -> ../../sdc
lrwxrwxrwx 1 root root 9 Feb 3 12:49 /dev/disk/by-path/pci-0000:0b:00.0-scsi-0:0:10:0 -> ../../sdk
lrwxrwxrwx 1 root root 9 Feb 3 12:49 /dev/disk/by-path/pci-0000:0b:00.0-scsi-0:0:11:0 -> ../../sdl
lrwxrwxrwx 1 root root 9 Feb 3 12:49 /dev/disk/by-path/pci-0000:0b:00.0-scsi-0:0:12:0 -> ../../sdm
lrwxrwxrwx 1 root root 9 Feb 3 12:49 /dev/disk/by-path/pci-0000:0b:00.0-scsi-0:0:2:0 -> ../../sdd
lrwxrwxrwx 1 root root 9 Feb 3 12:49 /dev/disk/by-path/pci-0000:0b:00.0-scsi-0:0:3:0 -> ../../sdf
lrwxrwxrwx 1 root root 9 Feb 3 12:49 /dev/disk/by-path/pci-0000:0b:00.0-scsi-0:0:4:0 -> ../../sde
lrwxrwxrwx 1 root root 9 Feb 3 12:49 /dev/disk/by-path/pci-0000:0b:00.0-scsi-0:0:5:0 -> ../../sdg
lrwxrwxrwx 1 root root 9 Feb 3 12:49 /dev/disk/by-path/pci-0000:0b:00.0-scsi-0:0:6:0 -> ../../sdh
lrwxrwxrwx 1 root root 9 Feb 3 12:49 /dev/disk/by-path/pci-0000:0b:00.0-scsi-0:0:8:0 -> ../../sdi
lrwxrwxrwx 1 root root 9 Feb 3 12:49 /dev/disk/by-path/pci-0000:0b:00.0-scsi-0:0:9:0 -> ../../sdj
3.2 配置以PATH 为路径的UDEV规则
#root@rac1>
#root@rac2>
cat > /etc/udev/rules.d/99-oracle-asm-disks.rules << 'EOF'
# 使用序号而不是 sdX 名称
SUBSYSTEM=="block", ENV{ID_PATH}=="pci-0000:0b:00.0-scsi-0:0:0:0", SYMLINK+="oracleasm/asm-disk01"
SUBSYSTEM=="block", ENV{ID_PATH}=="pci-0000:0b:00.0-scsi-0:0:1:0", SYMLINK+="oracleasm/asm-disk02"
SUBSYSTEM=="block", ENV{ID_PATH}=="pci-0000:0b:00.0-scsi-0:0:2:0", SYMLINK+="oracleasm/asm-disk03"
SUBSYSTEM=="block", ENV{ID_PATH}=="pci-0000:0b:00.0-scsi-0:0:3:0", SYMLINK+="oracleasm/asm-disk04"
SUBSYSTEM=="block", ENV{ID_PATH}=="pci-0000:0b:00.0-scsi-0:0:4:0", SYMLINK+="oracleasm/asm-disk05"
SUBSYSTEM=="block", ENV{ID_PATH}=="pci-0000:0b:00.0-scsi-0:0:5:0", SYMLINK+="oracleasm/asm-disk06"
SUBSYSTEM=="block", ENV{ID_PATH}=="pci-0000:0b:00.0-scsi-0:0:6:0", SYMLINK+="oracleasm/asm-disk07"
SUBSYSTEM=="block", ENV{ID_PATH}=="pci-0000:0b:00.0-scsi-0:0:8:0", SYMLINK+="oracleasm/asm-disk08"
SUBSYSTEM=="block", ENV{ID_PATH}=="pci-0000:0b:00.0-scsi-0:0:9:0", SYMLINK+="oracleasm/asm-disk09"
SUBSYSTEM=="block", ENV{ID_PATH}=="pci-0000:0b:00.0-scsi-0:0:10:0", SYMLINK+="oracleasm/asm-disk10"
SUBSYSTEM=="block", ENV{ID_PATH}=="pci-0000:0b:00.0-scsi-0:0:11:0", SYMLINK+="oracleasm/asm-disk11"
SUBSYSTEM=="block", ENV{ID_PATH}=="pci-0000:0b:00.0-scsi-0:0:12:0", SYMLINK+="oracleasm/asm-disk12"
# 设置权限(根据您的环境调整用户和组)
SUBSYSTEM=="block", ENV{ID_PATH}=="pci-0000:0b:00.0-scsi-0:0:*:0", OWNER="grid", GROUP="asmadmin", MODE="0660"
EOF
3.3 3. 应用规则
#root@rac1>
#root@rac2>
# 创建目录
mkdir -p /dev/oracleasm
# 重新加载规则
udevadm control --reload-rules
udevadm trigger --type=devices --subsystem-match=block
# 或者完全重启 udev
systemctl restart systemd-udevd
# 重新扫描所有磁盘
for host in /sys/class/scsi_host/host*; do
echo "- - -" > $host/scan 2>/dev/null || true
done
3.4 4. 验证结果
# 查看固定的符号链接
ls -l /dev/oracleasm/
lrwxrwxrwx 1 root root 6 Feb 3 12:59 asm-disk01 -> ../sdb
lrwxrwxrwx 1 root root 6 Feb 3 12:59 asm-disk02 -> ../sdc
lrwxrwxrwx 1 root root 6 Feb 3 12:59 asm-disk03 -> ../sdd
lrwxrwxrwx 1 root root 6 Feb 3 12:59 asm-disk04 -> ../sde
lrwxrwxrwx 1 root root 6 Feb 3 12:59 asm-disk05 -> ../sdf
lrwxrwxrwx 1 root root 6 Feb 3 12:59 asm-disk06 -> ../sdg
lrwxrwxrwx 1 root root 6 Feb 3 12:59 asm-disk07 -> ../sdh
lrwxrwxrwx 1 root root 6 Feb 3 12:59 asm-disk08 -> ../sdi
lrwxrwxrwx 1 root root 6 Feb 3 12:59 asm-disk09 -> ../sdj
lrwxrwxrwx 1 root root 6 Feb 3 12:59 asm-disk10 -> ../sdk
lrwxrwxrwx 1 root root 6 Feb 3 12:59 asm-disk11 -> ../sdl
lrwxrwxrwx 1 root root 6 Feb 3 12:59 asm-disk12 -> ../sdm
# 查看所有磁盘的 ID_PATH 映射
for disk in /dev/sd*[a-z]; do
echo -n "$disk -> "
udevadm info $disk | grep "ID_PATH=" | cut -d= -f2
done
/dev/sda -> pci-0000:03:00.0-scsi-0:0:0:0
/dev/sdb -> pci-0000:0b:00.0-scsi-0:0:0:0
/dev/sdc -> pci-0000:0b:00.0-scsi-0:0:1:0
/dev/sdd -> pci-0000:0b:00.0-scsi-0:0:2:0
/dev/sde -> pci-0000:0b:00.0-scsi-0:0:3:0
/dev/sdf -> pci-0000:0b:00.0-scsi-0:0:4:0
/dev/sdg -> pci-0000:0b:00.0-scsi-0:0:5:0
/dev/sdh -> pci-0000:0b:00.0-scsi-0:0:6:0
/dev/sdi -> pci-0000:0b:00.0-scsi-0:0:8:0
/dev/sdj -> pci-0000:0b:00.0-scsi-0:0:9:0
/dev/sdk -> pci-0000:0b:00.0-scsi-0:0:10:0
/dev/sdl -> pci-0000:0b:00.0-scsi-0:0:11:0
/dev/sdm -> pci-0000:0b:00.0-scsi-0:0:12:
3.5 重启后验证
ls -l /dev/disk/by-path/
# 检查所有链接是否一致
for path in /dev/disk/by-path/pci-0000:02:01.0-scsi-*; do
disk=$(readlink -f $path)
echo "$(basename $path) -> $disk"
done
4 NTP 服务
4.1 rac1 节点作为 NTP 服务端
- 编辑
/etc/chrony.conf配置文件 。
#rac1#root>
vi /etc/chrony.conf
- 修改第
3行 和第23行。
server 192.168.10.211 prefer
allow 192.168.10.0/24
- 重启NTP服务。
#rac1#root>
systemctl restart chronyd
systemctl status chronyd
systemctl enable chronyd
4.2 rac2 节点作为 NTP 客户端
- 编辑
/etc/chrony.conf配置文件。
#rac2#root>
vi /etc/chrony.conf
- 修改第
3行和。
server 192.168.10.216 iburst
- 重启服务
#rac2#root>
systemctl restart chronyd
systemctl status chronyd
systemctl enable chronyd
4.3 验证时间同步
#rac2#root>
chronyc sources
chronyc sourcestats
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^? rac1 0 6 0 - +0ns[ +0ns] +/- 0ns
Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev
==============================================================================
rac1 0 0 0 +0.000 2000.000 +0ns 4000ms
只要确定 Offset 为 0ns 即可。说明两台服务器时间一致。
5 准备安装介质
5.1 创建目录
#rac1#root>
cd /app
mkdir setup
mkdir db
mkdir grid
chown -R grid:dba grid/
chown -R oracle:dba db/
5.2 上传解压软件
上传GI+DB软件到 setup 目录,并解压到本地目录。
p13390677_112040_Linux-x86-64_1of7.zip
p13390677_112040_Linux-x86-64_2of7.zip
p13390677_112040_Linux-x86-64_3of7.zip
p18370031_112040_Linux-x86-64.zip
#rac1#root>
chown oracle:dba /app/setup
chmod 775 /app/setup
su - oracle
#rac1#oracle>
cd /app/setup
unzip -q p13390677_112040_Linux-x86-64_1of7.zip
unzip -q p13390677_112040_Linux-x86-64_2of7.zip
su - grid
#rac1#grid>
cd /app/setup
unzip -q p13390677_112040_Linux-x86-64_3of7.zip
unzip -q p18370031_112040_Linux-x86-64.zip
到此为止时,请打快照 DB_INSTALL_ENV 。
6 启动GI安装
在OEL7.0下安装,将会报以下错误:**
…
pa peer cert TP
profile reader pa cert TP
profile reader peer cert TP
peer user cert
pa user cert
Adding daemon to inittab
CRS-4124: Oracle High Availability Services startup failed.
CRS-4000: Command Start failed, or completed with errors.
ohasd failed to start: Inappropriate ioctl for device
ohasd failed to start at /u01/app/grid/product/11.2.0/grid/crs/install/rootcrs.pl line 443.
su - grid
#grid>
cd /app/setup/grid
export DISPLAY=192.168.10.131:0.0
./runInstaller
6.1 GI软件安装参数
| 参数 | 值 |
|---|---|
| skip software updates | |
| 安装选项 | Install and configure oracele grid for a cluster |
| 安装类型 | advanced installation. |
| cluster name | ASM |
| scan name | scan-ip |
| csan port | 1521 |
| 新加节点 | rac2,rac2-vip,grid ,并点击 setup . |
| 勾选 | reuseprivate and publuic keys . |
| ASM 磁盘组 | OCR(asmdisk01,asmdisk02,asmdisk03,asmdisk04) |
| AU size | 1MB |
| Redundancy | External |
| SYS\ASMSNMP 密码 | grid |
| OSASM | asmdba |
| OSDBA | asmdba |
| OSOPER | asmdba |
| Oracle Base | /u01/app/grid/base |
| 安装目录 | /u01/app/grid/product/11.2.0/db_1 |
| Inventory | /u01/app/grid/oraInventory |
- 磁盘路径为:> /dev/oracleasm/
- 注意
·Inventory目录要正确,否则无法打补丁。
6.2 GI 补丁安装
在执行 root.sh 之前,先安装补丁 Patch 18370031,方法为,使用 grid 用户执行以下命令即可之后,再执行 root.sh 即可。
在执行root.sh之前,先安装补丁Patch 18370031,方法为,使用grid用户执行以下命令即可之后,再执行root.sh即可。
两个节点都需要上传补丁文件,并按照节点顺序打补丁,不可同时执行。
- rac2节点创建目录。
su - root
#rac2#root>
mkdir /app/setup
chown grid:dba /app/ -R
- 传输补丁文件到rac2 节点。
#rac1#grid>
cd /app/setup
scp p18370031_112040_Linux-x86-64.zip rac2@/app/setup
- rac2 节点解压补丁文件。
su - grid
#rac2#grid>
cd /app/setup
unzip -q p18370031_112040_Linux-x86-64.zip
- rac1 和 rac2 节点打补丁。
#rac1#grid>
#rac2#grid>
/u01/app/grid/product/11.2.0/db_1/OPatch/opatch napply -oh /u01/app/grid/product/11.2.0/db_1/ -local /app/setup/18370031/
6.3 运行root 脚本
两个节点都需要执行,不可同时执行。
#rac1#root>
#rac2#root>
/u01/app/grid/oraInventory/orainstRoot.sh
/u01/app/grid/product/11.2.0/db_1/root.sh
7 创建ASM 磁盘组
启动 asmca 创建 ASM 磁盘组
su - grid
#rac1#grid>
export DISPLAY=192.168.10.131:0.0
asmca
| 选项 | 参数 | 使用的磁盘 |
|---|---|---|
| 磁盘组名称 | DATA | (asmdisk05-08) |
| 磁盘组名称 | FRA | (asmdisk09-12) |
| 磁盘组冗余 | External |
8 启动DB安装
su - oracle
#rac1#oracle>
cd /app/setup/database
export DISPLAY=192.168.10.131:0.0
./runInstaller
8.1 DB 软件安装参数
| 参数 | 值 |
|---|---|
| support eamil | 不勾选 |
| skip software updates | |
| install options | install database software only |
| 勾选 | resuse private and public keys |
| OS Password | oracle |
| language | 添加simplified chinese |
| 数据库版本 | 企业版 |
| oracle base | /u01/app/oracle |
| 软件安装目录 | /u01/app/oracle/product/11.2.0/db_1 |
| OSDBA | dba |
| OSOPER | dba |
链接和编译文件的时候会出现一个bug 安装时有出现一个错误:
Error in invoking target 'agent nmhs' of makefile '/u01/app/oracle/product/11.2.0/db_1/sysman/lib/ins_emagent.mk'
据说是Oracle的一个Bug,在新版系统下可能会表现出来.
解决方案: 保留安装过程,另外开启一个终端窗口,将ins_emagent.mk文件中的$(MK_EMAGENT_NMECTL)更改为$(MK_EMAGENT_NMECTL) -lnnz11,然后在安装过程中点击Retry即可。
8.2 Oracle数据库安装参数
su - oracle
#oracle>
export DISPLAY=192.168.10.131:0.0
dbca
| 选项 | 参数 |
|---|---|
| 数据库类型 | 选择GTP |
| Global Database Name | citdb |
| EM | 不勾选 |
| 自动维护工具 | 开启 |
| system 和sys 密码 | oracle |
| 数据文件存储 | ASM |
| SFRA (快速恢复区) | 4182 (默认) |
| sample schemas | 勾选 |
| SGA and PGA | 选择TYpical 并指定 70%。 |
| Process | 150 |
| 字符集 | AL16UTF16 |
| Connection mode | 独占模式 |
| Oracle-Manage | +DATA |
| 快速恢复区 | +FRA |
8.3 导入测试数据
导入 [[000-inbox/Oracle/inito.sql]] 脚本,生成 oa 模式。
8.4 密码过期处理
8.4.1 查看用户 Profile
#oracle>
sqlplus / as sysdba
SELECT username,PROFILE FROM dba_users WHERE username IN ('SYSTEM','OA');
8.4.2 更改 profile 策略
设置 profile 策略
#sys>
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
更多内容请参考 Oracle 密码过期策略
9 小结 & FAQ
9.1 操作系统不兼容
- 报错信息。
[WARNING] [INS-08101] Unexpected error while executing the action at state: 'supportedOSCheck'
CAUSE: No additional information available.
ACTION: Contact Oracle Support Services or refer to the software manual.
- 设置操作系统兼容模式
#oracle> or #grid>
export CV_ASSUME_DISTID=RHEL7.6
export CV_ASSUME_DISTID=RHEL7.6
9.2 互信问题
在安装过程中会报scp 无法连接的问题。报错信息如下。
报错信息:passwordless [ssh](https://so.csdn.net/so/search?q=ssh&spm=1001.2101.3001.7020) connectivity is not setup from the local node node1 to the following nodes node2
解决方案
1)Rename the original scp.
mv /usr/bin/scp /usr/bin/scp.orig
2)Create a new file .
vi /usr/bin/scp
3)Add the below line to the new created file .
/usr/bin/scp.orig -T $*
4)Change the file permission.
chmod 555 /usr/bin/scp
After installation:
mv /usr/bin/scp.orig /usr/bin/scp
9.3 删除磁盘组
count=1;
for i in {b..m};
do oracleasm deletedisk FRA$count;
let count+=1;
done
count=1;
for i in {b..m};
do oracleasm deletedisk DATA$count;
let count+=1;
done
count=1;
for i in {b..m};
do oracleasm deletedisk OCR$count;
let count+=1;
done
for i in {b..m};
do oracleasm deletedisk MGT$count;
let count+=1;
done
9.3.1 磁盘分区
#rac1#root>
for i in {b..m};
do fdisk /dev/sd$i << EOF
n
p
w
EOF
done
9.4 删除磁盘分区
for i in {b..m};
do fdisk /dev/sd$i << eof
d
w
eof
done